Go 套接字 Socket 编程 - 基本元素
Go 的网络包是由以下元素组成的
IP 类型相关
可以用它来计算掩码之类的东西,或者取得它的网络地址
import (
"fmt"
"net"
)
func main() {
addr := net.ParseIP("127.0.0.1")
mask := addr.DefaultMask()
network := addr.Mask(mask)
ones, bits := mask.Size()
fmt.Println(
" Address is ", addr.String(),
"\n Default mask length is ", bits,
"\n Leading ones count is ", ones,
"\n Mask is (hex) ", mask.String(),
"\n Network is ", network.String())
}
output
Address is 127.0.0.1
Default mask length is 32
Leading ones count is 8
Mask is (hex) ff000000
Network is 127.0.0.0
IPAddr 类型(DNS 查找)
IPAddr 类型内部就是一个 IP 地址
type IPAddr struct {
IP IP
Zone string // IPv6 scoped addressing zone
}
这种类型的主要用途是通过 IP 主机名执行 DNS 查找。
import (
"fmt"
"net"
"os"
)
func main() {
addr, err := net.ResolveIPAddr("ip", "baidu.com")
if err != nil {
fmt.Println("Resolution error", err.Error())
os.Exit(1)
}
fmt.Println("Resolved address is ", addr.String())
}
output:
Resolved address is 220.181.38.251
然而,通常主机如果有多个网卡,则可以有多个 IP 地址。所以可以使用 LookupHost
import (
"fmt"
"net"
"os"
)
func main() {
addrs, err := net.LookupHost("baidu.com")
if err != nil {
fmt.Println("Error ", err.Error())
os.Exit(1)
}
for _, s := range addrs {
fmt.Println(s)
}
}
output:
220.181.38.251
220.181.38.148
14.215.178.80
110.242.68.134
220.181.33.31
180.76.76.92
112.80.248.64
240e:bf:b801:1002:0:ff:b024:26de
240e:940:603:4:0:ff:b01b:589a
Port 系统的默认端口
在 Unix 系统中,在 /etc/services 文件里面列出了常用的端口。
$ more /etc/services
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
....
Go 语言有一个函数可以获取该文件。
func LookupPort(network, service string) (port int, err os.Error)
可以通过服务名取得默认端口
import (
"fmt"
"net"
"os"
)
func main() {
networkType := "tcp" // udp 和 tcp 端口是不一样的
service := "mysql"
port, err := net.LookupPort(networkType, service)
if err != nil {
fmt.Println("Error: ", err.Error())
os.Exit(2)
}
fmt.Println("Service port ", port)
}